#include <stdio.h>
#ifdef __cplusplus
extern const char *pszMACAddress=NULL;
extern unsigned char* pbyAddress=NULL;
extern unsigned char* MacAddrIntoByte(const char *pszMACAddress, unsigned char* pbyAddress);
extern char *MacAddrToString(char *pszMACAddress, unsigned char *pbyMacAddressInBytes);

 extern "C" {
 #endif 

const char cSep = ':'; //Bytes separator in MAC address string like 00-aa-bb-cc-dd-ee
unsigned char* MacAddrIntoByte (const char *pszMACAddress, unsigned char* pbyAddress);
char *MacAddrToString (char *pszMACAddress, unsigned char *pbyMacAddressInBytes); 

/*
	This function accepts MAC address in string format and returns in bytes. 
	it relies on size of byAddress and it must be greater than 6  bytes.
	If MAC address string is not in valid format, it returns NULL.

	NOTE: tolower function is used and it is locale dependent.
*/

unsigned char* MacAddrIntoByte
	(const char *pszMACAddress, unsigned char* pbyAddress)
{
	for (int iConunter = 0; iConunter < 6; ++iConunter)
	{
		unsigned int iNumber = 0;
		char ch;

		//Convert letter into lower case.
		ch = tolower (*pszMACAddress++);

		if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
		{
			return NULL;
		}

		//Convert into number. 
		iNumber = isdigit (ch) ? (ch - '0') : (ch - 'a' + 10);
		ch = tolower (*pszMACAddress);

		if ((iConunter < 5 && ch != cSep) || 
			(iConunter == 5 && ch != '\0' && !isspace (ch)))
		{
			++pszMACAddress;

			if ((ch < '0' || ch > '9') && (ch < 'a' || ch > 'f'))
			{
				return NULL;
			}

			iNumber <<= 4;
			iNumber += isdigit (ch) ? (ch - '0') : (ch - 'a' + 10);
			ch = *pszMACAddress;

			if (iConunter < 5 && ch != cSep)
			{
				return NULL;
			}
		}
		/* Store result.  */
		pbyAddress[iConunter] = (unsigned char) iNumber;
		/* Skip cSep.  */
		++pszMACAddress;
	}
	return pbyAddress;
}

/*
	This function converts Mac Address in Bytes to String format.
	It does not validate any string size and pointers.

	It returns MAC address in string format.
*/

char *MacAddrToString(char *pszMACAddress, 
				unsigned char *pbyMacAddressInBytes)
{
	sprintf(pszMACAddress, "%02x%c%02x%c%02x%c%02x%c%02x%c%02x", 
						pbyMacAddressInBytes[0] & 0xff,
						cSep,
						pbyMacAddressInBytes[1]& 0xff, 
						cSep,
						pbyMacAddressInBytes[2]& 0xff, 
						cSep,
						pbyMacAddressInBytes[3]& 0xff, 
						cSep,
						pbyMacAddressInBytes[4]& 0xff, 
						cSep,
						pbyMacAddressInBytes[5]& 0xff);

	return pszMACAddress;
} 

#ifdef __cplusplus
}
 #endif 
